Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 291f06de3bff08b88560919cda3618b3eee2f08e


Parents : 8522a5f
Author : Ivan <e46112d44649266d71fe2193e00a4710>
Signature : T66BB85Valid, signed by author
Date : 2026-07-19T06:24:44-05:00

refactor: streamline message handling and improve readability in MessagesPage and RelayChatPage components

Changes
Diff

diff --git a/meshchatx.rsm b/meshchatx.rsm
index 3308587f..214a8c88 100644
Binary files a/meshchatx.rsm and b/meshchatx.rsm differ

diff --git a/meshchatx/src/frontend/components/messages/MessagesPage.vue b/meshchatx/src/frontend/components/messages/MessagesPage.vue
index 0dbd051a..95276de8 100644
--- a/meshchatx/src/frontend/components/messages/MessagesPage.vue
+++ b/meshchatx/src/frontend/components/messages/MessagesPage.vue
@@ -1265,9 +1265,7 @@ export default {
if (conversation.is_unread) {
conversation.is_unread = false;
}
- Promise.resolve(
- window.api.post(`/api/v1/lxmf/conversations/${normalized}/mark-as-read`)
- )
+ Promise.resolve(window.api.post(`/api/v1/lxmf/conversations/${normalized}/mark-as-read`))
.then(() => {
GlobalEmitter.emit("notifications-changed");
NotificationUtils.clearMessageNotifications(normalized);

diff --git a/meshchatx/src/frontend/components/relay/RelayChatPage.vue b/meshchatx/src/frontend/components/relay/RelayChatPage.vue
index e0b9d6b3..b497de66 100644
--- a/meshchatx/src/frontend/components/relay/RelayChatPage.vue
+++ b/meshchatx/src/frontend/components/relay/RelayChatPage.vue
@@ -1718,9 +1718,9 @@ export default {
const hub = this.hubs.find((h) => h.hub_hash === saved.selectedHubHash);
const rooms = hub ? this.orderedRoomsFor(hub) : [];
if (saved.selectedRoom && rooms.includes(saved.selectedRoom)) {
- this.selectRoom(saved.selectedHubHash, saved.selectedRoom, { restore: true });
+ this.selectRoom(saved.selectedHubHash, saved.selectedRoom);
} else if (rooms.length > 0) {
- this.selectRoom(saved.selectedHubHash, rooms[0], { restore: true });
+ this.selectRoom(saved.selectedHubHash, rooms[0]);
}
}
},
@@ -2467,7 +2467,7 @@ export default {
selectHub(hubHash) {
this.selectedHubHash = hubHash;
},
- async selectRoom(hubHash, room, options = {}) {
+ async selectRoom(hubHash, room) {
this.selectedHubHash = hubHash;
this.selectedRoom = room;
this.expandedHubs[hubHash] = true;
@@ -2518,10 +2518,7 @@ export default {
hub.unread_counts = next;
}
if (typeof hub.total_unread === "number") {
- hub.total_unread = Object.values(hub.unread_counts || {}).reduce(
- (sum, n) => sum + (Number(n) || 0),
- 0
- );
+ hub.total_unread = Object.values(hub.unread_counts || {}).reduce((sum, n) => sum + (Number(n) || 0), 0);
}
this.updateUnreadBadge();
},

diff --git a/meshchatx/src/frontend/components/relay/RelayMessageEntry.vue b/meshchatx/src/frontend/components/relay/RelayMessageEntry.vue
index 9c9b658a..a4df6f6e 100644
--- a/meshchatx/src/frontend/components/relay/RelayMessageEntry.vue
+++ b/meshchatx/src/frontend/components/relay/RelayMessageEntry.vue
@@ -55,11 +55,13 @@
>
<span class="mr-1 text-xs text-sem-fg-muted">{{ page.formatTime(entry.msg.ts) }}</span>
* {{ page.displayName(entry.msg) }}
+ <!-- eslint-disable vue/no-v-html -- sanitized via renderMessageHtml -->
<span
class="break-words"
- v-html="page.renderMessageHtml(entry.msg.text)"
@click="page.handleMessageHtmlClick($event)"
+ v-html="page.renderMessageHtml(entry.msg.text)"
></span>
+ <!-- eslint-enable vue/no-v-html -->
</div>
<div
v-else-if="entry.msg"
@@ -70,11 +72,13 @@
>
<span class="mr-1.5 text-xs text-sem-fg-muted">{{ page.formatTime(entry.msg.ts) }}</span>
<span class="mr-1.5 font-semibold" :style="page.nameStyle(entry.msg)">{{ page.displayName(entry.msg) }}:</span>
+ <!-- eslint-disable vue/no-v-html -- sanitized via renderMessageHtml -->
<span
class="whitespace-pre-wrap break-words"
- v-html="page.renderMessageHtml(entry.msg.text)"
@click="page.handleMessageHtmlClick($event)"
+ v-html="page.renderMessageHtml(entry.msg.text)"
></span>
+ <!-- eslint-enable vue/no-v-html -->
</div>
</template>

diff --git a/tests/frontend/MarkdownRenderer.test.js b/tests/frontend/MarkdownRenderer.test.js
index 71f8333a..e6066759 100644
--- a/tests/frontend/MarkdownRenderer.test.js
+++ b/tests/frontend/MarkdownRenderer.test.js
@@ -557,7 +557,7 @@ describe("renderBasic (RRC / limited chat markdown)", () => {
});
it("renders https links and escapes HTML", () => {
- const result = MarkdownRenderer.renderBasic('hi <script>alert(1)</script> https://example.com/a');
+ const result = MarkdownRenderer.renderBasic("hi <script>alert(1)</script> https://example.com/a");
expect(result).not.toContain("<script>");
expect(result).toContain("&lt;script&gt;");
expect(result).toContain('href="https://example.com/a"');

diff --git a/tests/frontend/MessagesPage.test.js b/tests/frontend/MessagesPage.test.js
index 10b6f118..fd741700 100644
--- a/tests/frontend/MessagesPage.test.js
+++ b/tests/frontend/MessagesPage.test.js
@@ -619,9 +619,7 @@ describe("MessagesPage.vue", () => {
// simulate a conversation already opened in the focused pane (as onPeerClick does)
wrapper.vm.selectedPeer = { destination_hash: destHash, display_name: "Peer", is_unread: true };
- wrapper.vm.conversations = [
- { destination_hash: destHash, display_name: "Peer", is_unread: true },
- ];
+ wrapper.vm.conversations = [{ destination_hash: destHash, display_name: "Peer", is_unread: true }];
await wrapper.vm.$nextTick();
const composeSpy = vi.spyOn(wrapper.vm, "onComposeNewMessage");

diff --git a/tests/frontend/RelayChatPage.test.js b/tests/frontend/RelayChatPage.test.js
index c8d3f62d..a4df5779 100644
--- a/tests/frontend/RelayChatPage.test.js
+++ b/tests/frontend/RelayChatPage.test.js
@@ -189,9 +189,7 @@ describe("RelayChatPage.vue", () => {
expect(wrapper.vm.messages[0].text).toBe("hello");
expect(wrapper.vm.members.length).toBe(1);
expect(wrapper.text()).toContain("hello");
- expect(axiosMock.post).toHaveBeenCalledWith(
- `/api/v1/rrc/hubs/${HUB_HASH}/rooms/lobby/read`
- );
+ expect(axiosMock.post).toHaveBeenCalledWith(`/api/v1/rrc/hubs/${HUB_HASH}/rooms/lobby/read`);
});
it("clears local mention unread when marking an open room read", async () => {

diff --git a/tests/frontend/networkVisualiserWebGLEngine.test.js b/tests/frontend/networkVisualiserWebGLEngine.test.js
index 0c850b0f..1e0dac69 100644
--- a/tests/frontend/networkVisualiserWebGLEngine.test.js
+++ b/tests/frontend/networkVisualiserWebGLEngine.test.js
@@ -200,9 +200,8 @@ describe("networkVisualiserWebGLEngine", () => {
it("collectWebGLLabels follows canvas LOD bands", () => {
const nodes = new Float32Array([
- 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 20, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 30, 40, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 40,
+ 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
const labelByIndex = ["Local", "eth0", "Alice"];
const idByIndex = ["me", "eth0", "peer1"];
@@ -211,7 +210,9 @@ describe("networkVisualiserWebGLEngine", () => {
expect(collectWebGLLabels({ ...base, zoom: 0.1 })).toEqual([]);
expect(collectWebGLLabels({ ...base, zoom: 0.3 }).map((l) => l.text)).toEqual(["Local"]);
expect(
- collectWebGLLabels({ ...base, zoom: 0.3, hoverId: "peer1" }).map((l) => l.text).sort()
+ collectWebGLLabels({ ...base, zoom: 0.3, hoverId: "peer1" })
+ .map((l) => l.text)
+ .sort()
).toEqual(["Alice", "Local"]);
const high = collectWebGLLabels({ ...base, zoom: 0.8 });
expect(high.map((l) => l.text)).toEqual(["Local", "eth0", "Alice"]);


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────